package authorization.token;

import org.springframework.security.core.AuthenticationException;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.common.exceptions.InvalidTokenException;
import org.springframework.security.oauth2.provider.OAuth2Authentication;
import reactor.core.publisher.Mono;

/**
 * @author VuDo
 * @since 2/12/2021
 */
public interface ReactiveResourceServerTokenServices {


  /**
   * Load the credentials for the specified access token.
   *
   * @param accessToken The access token value.
   * @return The authentication for the access token.
   * @throws AuthenticationException If the access token is expired
   * @throws InvalidTokenException   if the token isn't valid
   */
  Mono<OAuth2Authentication> loadAuthentication(String accessToken) throws AuthenticationException, InvalidTokenException;

  /**
   * Retrieve the full access token details from just the value.
   *
   * @param accessToken the token value
   * @return the full access token with client id etc.
   */
  Mono<OAuth2AccessToken> readAccessToken(String accessToken);
}
